/**
 * ***************************************
 * @file exsram_drv.h
 * @author: AnRui
 * @version 0.1
 * @date  : 2025-05-26
 * @copyright Copyright (c) 2025
 * @desc: 外部SRAM驱动
 *        借助芯片的EXMC控制器
 *        注意:
 *            1. 设备手册中写 标准状态下读循环与写循环(地址建立周期和数据保持周期)的时间最小为55ns
 *               在gd32芯片中EXMC的时钟使用的是120MHZ时钟 1周期是 8.3ns
 *                  HCLK:时钟周期 8.3ns
 *                 EXMC 模式A 读   地址建立时间(ASET+1) HCLK + 数据建立时间(DSET+1) HCLK + 2 HCLK
 *                 EXMC 模式A 写   地址建立时间(WASET) HCLK + 数据建立时间(DSET) HCLK + 1 HCLK
 *                 把ASET和WASET都设置为0
 *                 DSET设置为6  读为 10*8.3 =83ns
 *                              写为 7*8.3=58.1ns
 *                 实验得到 DSET设置为0 也没问题
 *
 * ***************************************
 */
#ifndef __EXSRAM_DRV_H__
#define __EXSRAM_DRV_H__
#include "gd32f30x.h"
#include <stdio.h>
 /************************************************SRAM CONFIG************************************************/
 // 选择BANK0 第3块区域 作为外部SRAM 地址0x6C000000-0x63FF FFFF
 // 选择BANO 的哪部分区域 取决于 EXMC_NE0 EXMC_NE1 EXMC_NE2 EXMC_NE3 引脚被拉低
#define BANK0_REGON3_ADDR        ((uint32_t)(0x6C000000))    // Bank0 Regon3起始地址
#define EX_SRAM_BUFFER_SIZE      (512*1024*2)// 外部SRAM缓冲区大小 512K*16 换算成多少个字节
#define EX_SRAM_BEGIN_ADDR       (BANK0_REGON3_ADDR) //起始地址
#define EX_SRAM_END_ADDR         (BANK0_REGON3_ADDR + EX_SRAM_BUFFER_SIZE - 1)  //结束地址 0x6C100000 - 1
/************************************************EXMC CONFIG************************************************/

#define EX_SRAM_DATA_SETUP_TIME 3 // 数据建立时间  单位周期  按照计算 应该设置为6 实际测试3也可以
#define EX_SRAM_EXTEND_MODE  DISABLE // EXMC控制器的外部扩展模式 控制读时序与写时序是否要分开配置


/************************************************EXTERNAL FUNCTION************************************************/

/**
 * @desc  : 外部SRAM初始化
 * @date  : 2025-05-26
 * @author: AnRui
 * @note  :
 */
void ExSramDrvInit(void);

/**
 * @desc  : 外部SRAM测试
 * @date  : 2025-05-26
 * @author: AnRui
 * @note  :
 */
void ExSramDrvTest(void);

#endif
